package com.smart.common.entities.ajax;

import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.io.Serializable;
import java.time.LocalDateTime;

/**
 * ajax结果
 *
 * @author Ajax 统一返回结果
 * @date 2022-09-21
 */
@Data
public class AjaxResult<T> implements Serializable {

    /**
     * 返回状态码
     */
    @ApiModelProperty("返回状态码 0=正常返回 其他=异常返回")
    private int code;

    /**
     * 提醒消息
     */
    @ApiModelProperty("提示消息")
    private String message;

    /**
     * 数据明细
     */
    @ApiModelProperty("数据明细")
    private T data;

    /**
     * 接口返回时间
     */
    @ApiModelProperty("接口返回时间")
    private LocalDateTime time;


    private AjaxResult(int code, T data, String message) {
        this.code = code;
        this.data = data;
        this.message = message;
        this.time = LocalDateTime.now();
    }


    /**
     * 成功
     * 成功无参数 默认提示与
     *
     * @return {@code AjaxResult<String>}
     */
    public static AjaxResult<String> success() {
        return new AjaxResult<>(0, null, "操作成功");
    }

    /**
     * 成功自定义提示语
     *
     * @param message 消息
     * @return {@code AjaxResult<T>}
     */
    public static AjaxResult<String> success(String message) {
        return new AjaxResult<>(0, null, message);
    }


    /**
     * 删除成功提示
     *
     * @param data 数据
     * @return {@code AjaxResult<String>}
     */
    public static AjaxResult<Integer> delSuccess(int data) {
        String msg = "本次成功删除" + data + "条数据";
        return AjaxResult.data(data, msg);
    }

    /**
     * 直接返回请求数据 包含默认的成功信息
     **/
    public static <T> AjaxResult<T> data(T data) {
        return data(data, "操作成功");
    }


    /**
     * 直接返回请求数据 自定义请求信息
     **/
    public static <T> AjaxResult<T> data(T data, String message) {
        return data(0, data, message);
    }

    /**
     * 自定义查状态吗 和数据  和自定义数据
     **/
    public static <T> AjaxResult<T> data(int code, T data, String message) {
        return new AjaxResult<>(code, data, message);
    }


    public static <T> AjaxResult<T> fail(int code, String message) {
        return new AjaxResult<>(code, null, message);
    }

    public static <T> AjaxResult<T> fail(AjaxResultEnum resultEnum) {
        return new AjaxResult<>(resultEnum.code, null, resultEnum.message);
    }


}